"""
函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块。
函数能提高应用的模块性，和代码的重复利用率。

1. 函数的定义格式：
   def 函数名(参数列表):
       函数体
       return [返回值]

2. 函数定义示例：
   def greet(name):
       '''打印问候语'''
       print(f"Hello, {name}!")
       
   def add(a, b):
       '''返回两个数的和'''
       return a + b

3. 函数调用：
   定义函数后，通过函数名+参数列表来调用函数
   greet("张三")
   result = add(3, 5)

4. 函数参数类型：
   - 必需参数：必须以正确的顺序传入函数
   - 关键字参数：允许函数调用时参数的顺序与声明时不一致
   - 默认参数：调用函数时，如果没有传递参数值，则会使用默认参数
   - 不定长参数：能处理比当初声明时更多的参数

5. 函数的返回值：
   - return语句用于退出函数并返回结果
   - 如果函数没有return语句，则返回None
   - 函数可以返回多个值，实际上是返回一个元组
"""

# 1. 简单函数定义和调用
def say_hello():
    """无参数无返回值的函数示例"""
    print("Hello, World!")

# 调用函数
say_hello()

# 2. 带参数的函数
def greet(name):
    """带参数无返回值的函数示例"""
    print(f"你好, {name}!")

# 调用带参数的函数
greet("小明")

# 3. 带返回值的函数
def add(a, b):
    """带参数带返回值的函数示例"""
    return a + b

# 调用带返回值的函数
result = add(3, 5)
print(f"3 + 5 = {result}")

# 4. 带默认参数的函数
def greet_with_default(name="朋友"):
    """带默认参数的函数示例"""
    print(f"你好, {name}!")

# 调用带默认参数的函数
greet_with_default()        # 使用默认参数
greet_with_default("小红")   # 使用传入的参数

# 5. 关键字参数:在函数调用时，通过"参数名=值"的形式来指定参数值，这样就不需要按照函数定义时的参数顺序来传递参数
def introduce(name, age):
    """使用关键字参数的函数示例"""
    print(f"我叫{name}, 今年{age}岁")

# 使用关键字参数调用函数
introduce(age=18, name="小刚")  # 参数顺序可以和定义时不同

# 6. 返回多个值的函数
def calculate(a, b):
    """返回多个值的函数示例"""
    sum_result = a + b
    diff_result = a - b
    return sum_result, diff_result

# 调用返回多个值的函数
sum_val, diff_val = calculate(10, 5)
print(f"和: {sum_val}, 差: {diff_val}")